package dao

import (
	"fmt"

	"gitee.com/huangxinbo/xcas/internal/app/base"
	"gitee.com/huangxinbo/xcas/internal/model"
	"gitee.com/huangxinbo/xcas/internal/model/db_model"
	"gitee.com/huangxinbo/xcas/pkg"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

type OAuthUserDAO struct {
	base *base.Base
}

func NewOAuthUserDAO(base *base.Base) *OAuthUserDAO {
	return &OAuthUserDAO{
		base: base,
	}
}

// GetByProviderAndID 根据提供商和提供商ID获取 OAuth 用户
func (d *OAuthUserDAO) GetByProviderAndID(ctx *gin.Context, provider model.OAuthProvider, providerID string) (*db_model.OAuthUser, error) {
	fmt.Printf("%s, %s", pkg.Red(string(provider)), providerID)
	var oauthUser db_model.OAuthUser
	err := d.base.Db.WithContext(ctx).Where("provider = ? AND provider_id = ?", provider, providerID).First(&oauthUser).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return nil, nil
		}
		return nil, err
	}
	return &oauthUser, nil
}

// GetByUserID 根据用户ID获取 OAuth 用户列表
func (d *OAuthUserDAO) GetByUserID(ctx *gin.Context, userID string) ([]*db_model.OAuthUser, error) {
	var oauthUsers []*db_model.OAuthUser
	err := d.base.Db.WithContext(ctx).Where("user_id = ?", userID).Find(&oauthUsers).Error
	if err != nil {
		return nil, err
	}
	return oauthUsers, nil
}

// GetByUserIDAndProvider 根据用户ID和提供商获取 OAuth 用户
func (d *OAuthUserDAO) GetByUserIDAndProvider(ctx *gin.Context, userID, provider string) (*db_model.OAuthUser, error) {
	var oauthUser db_model.OAuthUser
	err := d.base.Db.WithContext(ctx).Where("user_id = ? AND provider = ?", userID, provider).First(&oauthUser).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return nil, nil
		}
		return nil, err
	}
	return &oauthUser, nil
}

// Create 创建 OAuth 用户
func (d *OAuthUserDAO) Create(ctx *gin.Context, oauthUser *db_model.OAuthUser) error {
	return d.base.Db.WithContext(ctx).Create(oauthUser).Error
}

// Update 更新 OAuth 用户
func (d *OAuthUserDAO) Update(ctx *gin.Context, oauthUser *db_model.OAuthUser) error {
	return d.base.Db.WithContext(ctx).Save(oauthUser).Error
}

// DeleteByUserIDAndProvider 根据用户ID和提供商删除 OAuth 用户
func (d *OAuthUserDAO) DeleteByUserIDAndProvider(ctx *gin.Context, userID, provider string) error {
	return d.base.Db.WithContext(ctx).Where("user_id = ? AND provider = ?", userID, provider).Delete(&db_model.OAuthUser{}).Error
}

// DeleteByUserID 根据用户ID删除所有 OAuth 用户
func (d *OAuthUserDAO) DeleteByUserID(ctx *gin.Context, userID string) error {
	return d.base.Db.WithContext(ctx).Where("user_id = ?", userID).Delete(&db_model.OAuthUser{}).Error
}
